package bizzard.shared;

import java.util.*;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.thoughtworks.xstream.annotations.XStreamAlias;


//+----------------------------------------------------------------------+
//| Troll
//|
//| name			: 	nom du troll
//| competences		: 	hashMap indexé sur la competence associé au nombre de points donnés à l'attribut
//| caracteres		: 	hashMap indexé sur le caractere associé au nombre de points donnés à l'attribut
//| race			: 	race du troll
//|
//| - classe de données
//+----------------------------------------------------------------------+

@XStreamAlias("Troll")
public class Troll implements IsSerializable {

	private String name;
	private HashMap<Attribut, Integer> competences; 
	private HashMap<Attribut, Integer> caracteres; //NB les caracteristiques dependent de la race
	private Race race;
	private String img;
	
	/**
	 ** constructeur
	 **/
	public Troll() {
		this.competences = new HashMap<Attribut, Integer>();
		this.caracteres = new HashMap<Attribut, Integer>();
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	
	public HashMap<Attribut, Integer> getCompetences() {
		return competences;
	}

	public HashMap<Attribut, Integer> getCaracteres() {
		return caracteres;
	}
	
	public void setRace(Race race) {
		race.addTroll(this);
		this.race = race;
	}
	
	public Race getRace() {
		return race;
	}
	
	public void setImg(String img) {
		this.img = img;
	}
	
	public String getImg() {
		return img;
	}
	
	public void addCompetence(Attribut attr, Integer point) {
		competences.put(attr, point);
	}
	
	public void addCaractere(Attribut attr, Integer point) {
		caracteres.put(attr, point);
	}
	
	public void clear() {
		this.competences = new HashMap<Attribut, Integer>();
		this.caracteres = new HashMap<Attribut, Integer>();
	}
	
	/*******************************************************************************
	 * associe le nombre de points à l'attribut donné (existant pour le type donné)
	 * 
	 * @param type ~ competence ou caractere
	 * @param name ~ le nom de l'attribut
	 * @param points ~ les points à lui donner
	 ******************************************************************************/ 
	public void setPoints(String type, String name, Integer points) {
		if(type=="competence") {		
			competences.put(get(competences, name), points);
		}
		else if(type=="caractere") {		
			caracteres.put(get(caracteres, name), points);
		}
	}
	
	/*******************************************************************************
	 * cherche l'attribut du type donné
	 * 
	 * @param hash ~ hashmap d'attribut
	 * @param name ~ nom de l'attribut à rechercher
	 * @return l'attribut
	 ******************************************************************************/ 
	private Attribut get(HashMap<Attribut, Integer> hash, String name) {
	    for (Attribut item : hash.keySet()) {
		  if(item.getName()==name)
			  return item;
		}
		return null;
	}
}
